﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Cesave.Domain.PermisosModule.Entities;
using Cesave.Infrastructure.Data.PermisosModule.Context;
using Cesave.Infrastructure.CrossCutting.Logging;
using Cesave.Domain.PermisosModule.Contracts.Ciclos;
using Cesave.Infrastructure.Data.PermisosModule.Repositories;

namespace Cesave.Infrastructure.Data.PermisosModule.Tests.RepositoriesTests
{
	[TestClass]
	public class CicloRepositoryTests
		: GenericRepositoryTestsBase<Ciclo>
	{
		/// <summary>
		/// 
		/// </summary>
		public override System.Linq.Expressions.Expression<Func<Ciclo, bool>> FilterExpression
		{
			get
			{
				return ciclo => ciclo.CicloId == 1;
			}
		}

		/// <summary>
		/// 
		/// </summary>
		public override System.Linq.Expressions.Expression<Func<Ciclo, int>> OrderByExpression
		{
			get
			{
				return ciclo => ciclo.CicloId;
			}
		}

		[TestMethod]
		public void FindAllCiclos_Invoke()
		{
			// Arrange
			IPermisosModuleContext context = GetContext();
			ITraceManager traceManager = GetTraceManager();
			ICicloRepository repository = new CicloRepository(context, traceManager);

			// Act
			var actual = repository.FindAllCiclos();

			// Assert
			Assert.IsNotNull(actual);
		}

		[TestMethod]
		[ExpectedException(typeof(ArgumentNullException))]
		public void FindCiclosByStatusSpecification_Null_Specification_Throws_ArgumentNullException()
		{
			// Arrange
			IPermisosModuleContext context = GetContext();
			ITraceManager traceManager = GetTraceManager();
			ICicloRepository repository = new CicloRepository(context, traceManager);

			CiclosByStatusSpecification specification = null;

			// Act
			var actual = repository.FindCiclosByStatusSpecification(specification);
		}

		[TestMethod]
		public void FindCiclosByStatusSpecification_Invoke()
		{
			// Arrange
			IPermisosModuleContext context = GetContext();
			ITraceManager traceManager = GetTraceManager();
			ICicloRepository repository = new CicloRepository(context, traceManager);

			CiclosByStatusSpecification specification = new CiclosByStatusSpecification(true);

			// Act
			var actual = repository.FindCiclosByStatusSpecification(specification);

			// Assert
			Assert.AreEqual(3, actual.Count());
		}

		[TestMethod]
		[ExpectedException(typeof(ArgumentNullException))]
		public void FindCicloByCicloActualSpecification_Null_Specification_Throws_ArgumentNullSpecification()
		{
			// Arrange
			IPermisosModuleContext context = GetContext();
			ITraceManager traceManager = GetTraceManager();
			ICicloRepository repository = new CicloRepository(context, traceManager);

			CicloActualSpecification specification = null;

			// Act
			var actual = repository.FindCicloByCicloActualSpecification(specification);
		}

		[TestMethod]
		public void FindCicloByCicloActualSpecification_Invoke()
		{
			// Arrange
			IPermisosModuleContext context = GetContext();
			ITraceManager traceManager = GetTraceManager();
			ICicloRepository repository = new CicloRepository(context, traceManager);

			CicloActualSpecification specification = new CicloActualSpecification();

			// Act
			var actual = repository.FindCicloByCicloActualSpecification(specification);

			// Assert
			Assert.IsNotNull(actual);
			Assert.IsTrue(actual.Actual);
		}

		[TestMethod]
		[ExpectedException(typeof(ArgumentNullException))]
		public void FindCicloByCicloGuidSpecification_Null_Specification_Throws_ArgumentNullSpecification()
		{
			// Arrange
			IPermisosModuleContext context = GetContext();
			ITraceManager traceManager = GetTraceManager();
			ICicloRepository repository = new CicloRepository(context, traceManager);

			CicloByGuidSpecification specification = null;

			// Act
			var actual = repository.FindCicloByGuidSpecification(specification);
		}

		[TestMethod]
		[ExpectedException(typeof(InvalidOperationException))]
		public void FindCicloByCicloGuidSpecification_Empty_Guid_Throws_InvalidOperationException()
		{
			// Arrange
			IPermisosModuleContext context = GetContext();
			ITraceManager traceManager = GetTraceManager();
			ICicloRepository repository = new CicloRepository(context, traceManager);

			Guid cicloGuid = Guid.Empty;
			CicloByGuidSpecification specification = new CicloByGuidSpecification(cicloGuid);

			// Act
			var actual = repository.FindCicloByGuidSpecification(specification);
		}

		[TestMethod]
		public void FindCicloByCicloGuidSpecification_Invoke()
		{
			// Arrange
			IPermisosModuleContext context = GetContext();
			ITraceManager traceManager = GetTraceManager();
			ICicloRepository repository = new CicloRepository(context, traceManager);

			Guid cicloGuid = new Guid("33E3AD3B-E4A6-4E6C-ADD4-2D683898EB98");
			CicloByGuidSpecification specification = new CicloByGuidSpecification(cicloGuid);

			// Act
			var actual = repository.FindCicloByGuidSpecification(specification);

			// Assert
			Assert.IsNotNull(actual);
			Assert.AreEqual(cicloGuid, actual.CicloGuid);
			Assert.AreEqual("2010-2011", actual.Nombre);
		}

	}
}
